package com.example.tdam_2012_g3;


import java.io.InputStream;
import java.util.ArrayList;
import Adaptadores.AdaptadorListaTelefonos;
import Persistencia.CreadorBD;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.database.Cursor;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
import entidades.Log;

public class Activity_Contactos extends ListActivity {
	private ArrayList<String> telefonos;
	private ArrayList<String> emails;
	private ArrayAdapter<String> adaptador;
	private final static int INPUT_DIALOG = 1;
	private ImageView imagenContacto;
	private String idContacto;
	private String nombreContacto;
	private String inputResult;
	private CreadorBD base;
	private TextView nombre;
	private TextView email;
	private ListView listaemails;
	private ListView listanumeros;
	private Button btnMensaje;

	public Activity_Contactos() {
		telefonos = new ArrayList<String>();
		emails = new ArrayList<String>();
		idContacto = "";

	}

	public void onResume(Bundle savedInstanceState) {
		super.onResume();

	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_contactos);
		idContacto = getIntent().getExtras().getString("id_contacto");
		nombreContacto = this.buscarNombreDeContacto(idContacto);
		base = new CreadorBD(this.getApplicationContext());
		this.cargarTelefonosContacto(idContacto);
		this.cargarEmailsContacto(idContacto);
		
		nombre = (TextView) this.findViewById(R.id.nombre_contaco);
		nombre.setText(this.buscarNombreDeContacto(idContacto));
		btnMensaje = (Button) findViewById(R.id.btnMsjServidor);
		listaemails = (ListView) this.findViewById(R.id.lista_mails);
		imagenContacto = (ImageView) this.findViewById(R.id.imagen_contacto_particular);
		email = (TextView) this.findViewById(R.id.txtMails);
		
		adaptador = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1, this.emails);
		listaemails.setAdapter(adaptador);
		AdaptadorListaTelefonos adaptadorListaTelefonos = new AdaptadorListaTelefonos(this);
		adaptadorListaTelefonos.setNombreContacto(nombreContacto);
		adaptadorListaTelefonos.cargarTelefonos(telefonos);
		setListAdapter(adaptadorListaTelefonos);
		
		listaemails.setOnItemClickListener(tomarClickListaEmail);
		btnMensaje.setOnClickListener(capturarClickBotonServidor);
		
		cargarFoto();

	}

	/**
	 * Metodo para cargar la foto del contacto...no funciona bien
	 */
	private void cargarFoto() {
		Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_URI,idContacto);
	
		InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(getContentResolver(), uri);

		if (input == null) {

		} else {

			imagenContacto.setImageBitmap(BitmapFactory.decodeStream(input));
		}
	}

	public void onResume() {
		super.onResume();
		nombre.setText(this.buscarNombreDeContacto(idContacto));// ?

	}

/**
 * Metodo para crear el menu
 */
	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_contactos, menu);
		return true;

	}
/**
 * Metodo para tomar la seleccion del menu
 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// Handle item selection
		switch (item.getItemId()) {
		case R.id.menu_particular_log:
			saveParticularContact(nombreContacto);
			startActivity(new Intent(Activity_Contactos.this, ActivityLog.class));
			return true;

		case R.id.menu_contacto_particular_asociar_a_servidor:
			this.showDialog(INPUT_DIALOG);
			return true;
		default:
			return true;
		}
	}

	
	/**
	 * Metodo para cargar los telefonos de un contacto
	 * @param id: representa el  id del contacto al cual se le cargan los Numeros telefonicos
	 */

	public void cargarTelefonosContacto(String idContacto) {
		Cursor pCur = getContentResolver().query(
				ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
				ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=?",
				new String[] { idContacto }, null);
		while (pCur.moveToNext()) {
			telefonos.add((pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER))));
		}
	
		pCur.close();

	}
	/**
	 *  Metodo para cargar los Emails de un contacto
	 * @param id: representa el  id del contacto al cual se le cargan los Numeros telefonicos
	 */
	public void cargarEmailsContacto(String id) {
		Cursor eCur = this.getContentResolver().query(
				ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
				ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=?",
				new String[] { id }, null);
		while (eCur.moveToNext()) {
			String email = eCur
					.getString(eCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
			String emailType = eCur.getString(eCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
			emails.add(email);
		}
		eCur.close();

	}
	
/**
 * Metodo que busca el nombre de un contacto en particulas
 * @param id del contacto a buscar
 */
	public String buscarNombreDeContacto(String id) {
		String nombre = "";
		Cursor nom = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null,ContactsContract.Contacts._ID + " =?", new String[] { id },	null);
		if (nom.moveToNext()) {
			nombre = nom.getString(nom.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
		}
		nom.close();
		return nombre;
	}


/**
 * Funcionalidad de los items de la lista de emails, llama al intento correspondiente para
 * enviar un mail y registra la accion en el log
 */
	OnItemClickListener tomarClickListaEmail = new OnItemClickListener() {

		public void onItemClick(AdapterView<?> arg0, View view, int position,long arg3) {
			// TextView email = (TextView)arg1.findViewById(R.id.txtMails);
			Intent intento = new Intent(Intent.ACTION_SEND);
     		intento.setType("plain/text");
			String emailTo = emails.get(position);
			intento.putExtra(Intent.EXTRA_EMAIL, new String[] { emailTo });
			CreadorBD base = new CreadorBD(getApplicationContext());
			Log l = new Log();
			l.setUsuario(nombreContacto);
			l.setAccion(Log.MAIL);
			base.insertarNuevaAccion(l);
			startActivity(Intent.createChooser(intento, "Enviar con"));

		}
	};
	/**
	 * Funcionalidad del boton para enviar mensaje al servidor
	 * si no esta conectado, o el contacto no esta registrado en el servidor
	 * no permite lanzar el intent
	 * 
	 */
	OnClickListener capturarClickBotonServidor = new OnClickListener() {
		public void onClick(View view) {
			if (readIsConnected()) {
				if (base.estaAsociado(idContacto)) {
					Intent intento = new Intent(getApplicationContext(),
							Activity_MsjServidor.class);
					intento.putExtra("id_contacto", idContacto);
					startActivity(intento);
				} else
					mostrarToast(getString(R.string.str_contacto_no_asociado)).show();
			} else
				mostrarToast(getString(R.string.str_no_hay_conexion)).show();
		}

	};

	/**
	 * Metodo para crear dialogo
	 */
	protected Dialog onCreateDialog(int id) {
		Dialog dialogo = null;

		switch (id) {
		case INPUT_DIALOG:
			dialogo = crearInputDialog();
			break;

		}

		return dialogo;
	}
  /**
   * Crea el InputDialog para relizar el registro dle contacto al servidor
   * si el usuario ya esta previamente registrado, o el nombre es vacio no lo registra
   * @return
   */
	private Dialog crearInputDialog() {
		LayoutInflater li = LayoutInflater.from(this.getApplicationContext());
		View promptsView = li.inflate(R.layout.input_dialog_layout, null);
		AlertDialog.Builder builder = new AlertDialog.Builder(this);
		builder.setView(promptsView);
		final EditText userInput = (EditText) promptsView.findViewById(R.id.edtxtInputDialog);
		builder.setTitle(getString(R.string.str_atencion));
		builder.setPositiveButton("OK",
				new android.content.DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						inputResult = userInput.getText().toString();
						if (!inputResult.equals("")) {
							if (!base.estaAsociado(idContacto)) {
								if (base.asociarContacto(idContacto, inputResult)) {
									mostrarToast(getString(R.string.str_asociacion_exitosa_contacto)).show();												
								}
							} else {
								mostrarToast(getString(R.string.str_asociacion_fail_repetido)).show();
							}
						} else {
							mostrarToast(getString(R.string.str_asociacion_fail_vacio)).show();
						}
					}
				});
		builder.setNegativeButton("Cancel",negativeButton);
		return builder.create();
	}
   
	/**
     * OnClick negative button
     */
	DialogInterface.OnClickListener negativeButton = new DialogInterface.OnClickListener() {
		public void onClick(DialogInterface dialog, int id) {
			dialog.cancel();
		}
	};
	
	/**
	 * Muestra un toast
	 * @param mensaje: texto a mostrar en el toast
	 * @return el toast a mostrar
	 */
	public Toast mostrarToast(String mensaje) {
		Toast toast = Toast.makeText(getApplicationContext(), mensaje,
				Toast.LENGTH_SHORT);
		return toast;
	}
	/**
	 * lee la preferencia isConnected y devuelve su resultado
	 * @return el valor de la preferencia
	 */
	public boolean readIsConnected() {
		SharedPreferences myPreference = PreferenceManager
				.getDefaultSharedPreferences(this.getApplicationContext());

		return myPreference.getBoolean("connected", false);

	}

	/**
	 * Metodo que setea la preferencia de filtro por usuario de las acciones
	 * se usa para llamar al los de acciones general, pero filtrandolo por el contacto acutal
	 * @param contact el contacto a filtrar en el log de acciones
	 */
	public void saveParticularContact(String contact) {
		SharedPreferences myPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
		Editor editMyPreferences = myPreferences.edit();
		editMyPreferences.putString("logUsuario", contact);
		editMyPreferences.commit();

	}
}
